#include <opencv/cv.h>
#include <opencv/highgui.h>

#include <iostream>

#include <math.h>

#ifndef LBP_H
#define LBP_H

class LBP
{
	public:	
		LBP();	
		LBP(int r, int p);
		LBP(cv::Mat & img,int r, int p);
		
		/**
		@brief
		Initialisation
		Precalcul la position des voisins + affecte l'image
		*/
		void create(int r, int p);

		/**
		@brief
		Initialisation
		Precalcul la position des voisins + affecte l'image
		*/
		void create(cv::Mat & img,int r, int p);

		/**
		@brief	
		pré- affecte l'image sur laquelle sera calculé les LBP
		*/
		void setImage(cv::Mat & img);
		
		/**
		@brief
		Retourne le LBP calculé à la position row col de l'image
		*/
		int getLBP(int row,int col);

		/**
		@brief
		Retourne l'histogramme des LBP standards
		*/
		void getHist(cv::Mat & histLBP);
			
		/**
		@brief		
		Retourne l'histogramme des LBP uniformes
		*/
		void getUniformHist(cv::Mat & histLBP);

		/**
		@brief
		Retourne vrai si le LBP est uniform
		Un LBP uniforme ne possède que au plus deux transitions 01 ou 10
		Ils sont caractéristiques de points d'angles ou de coins
		*/
		bool isUniform(int lbp);

	private:
		cv::Mat image;
		cv::Mat_<float> hist;
			
		long * w;//les poids precalculés

		int r,p;
		std::vector<cv::Point> neighbourhood;		
};

#endif
